package leetcode.editor.cn;
//Java：N 字形变换
public class ZigzagConversion {
    public static void main(String[] args) {
        Solution solution = new ZigzagConversion().new Solution();
        solution.convert("PAYPALISHIRING",4);
    }

    //leetcode提交区域开始
    class Solution {
        public String convert(String s, int numRows) {
            // 当 numRows 为 1 时，直接返回原字符串，因为没有必要进行Z字形转换
            if (numRows == 1) return s;

            // step: 一个完整的Z字形周期中的字符数
            int step = 2 * numRows - 2;

            // index: 用于遍历原字符串 s 的指针
            int index = 0;

            // len: 字符串的长度
            int len = s.length();

            // add: 用于帮助我们在Z字形中跳到下一个字符
            int add = 0;

            // re: 用于存储最终的结果
            StringBuffer re = new StringBuffer();

            // 外循环：遍历每一行
            for (int i = 0; i < numRows; i++) {
                // 设置开始的索引为当前行号
                index = i;

                // 计算当前行中字符与下一个字符之间的距离
                add = i * 2;

                // 内循环：遍历原字符串，并根据Z字形的规则添加字符到结果中
                while (index < len) {
                    re.append(s.charAt(index));
                    // 根据当前行号来决定下一个字符的位置
                    add = step - add;
                    if ((i == 0) || (i == numRows - 1)) {
                        index = index + step; // 第一行和最后一行，每次跳过固定数量的字符
                    } else {
                        index = index + add; // 其他行，则根据计算的add值跳过字符
                    }
                }
            }
            // 返回最终的结果
            return re.toString();
        }
    }
}
